package com.itheima.tlias.controller;

import com.itheima.tlias.annotation.Log;
import com.itheima.tlias.pojo.dto.SelectDeptDTO;
import com.itheima.tlias.pojo.entity.Dept;
import com.itheima.tlias.pojo.po.InsertDeptParam;

import com.itheima.tlias.service.DeptService;
import com.itheima.tlias.common.result.Result;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/depts")
/**
 * @RequestMapping Target -> 限制用在类上，方法上
 * @                类上 -> 提取一个controller中的重复路径
 *                  方法上 -> 定义该接口的请求方法的 被对应的GetMapping、PostMapping等替代了
 */
public class DeptController {

    /**
     * @Resource 优先属性注入使用
     *          默认按照Bean名字从容器获取
     *          默认的SpringBean名字是类对应的小驼峰
     *          不同包下可能存在同名类
     *          解决 方法
     * @Component 注解在创建Bean的时候指定名字
     * @Resource 从IOC容器中获取时也指定名字
     */
    //@Autowired
    @Resource
    DeptService deptService;

    @GetMapping
    //@RequestMapping(method = RequestMethod.GET)
    public Result selectAll() {
        List<SelectDeptDTO> depts = deptService.selectAll();
        return Result.success(depts);
    }
    /*public Map<String, Object> selectAll(){
        List<SelectAllDeptDTO> depts = deptService.selectAll();
        HashMap<String, Object> map = new HashMap<>();
        map.put("code", 1);
        map.put("data", depts);
        map.put("msg","查询成功");
        return map;

    }*/

    /**
     * get/delete ；请求参数一般拼接到url后面
     * post/put 请求参数一般放在请求体里，且以JSON格式进行传输
     *
     * @RequestBody 1.作用就是从Http请求体中读传输的数据
     * 2.把Json字符串自动变成对象
     */
    @Log
    @PostMapping
    //@RequestMapping(method = RequestMethod.POST)
    public Result insertDept(@Validated @RequestBody InsertDeptParam param) {
        //把JSON字符串变对象
        log.info("读取请求体中的数据{}", param.getName());
        Dept dept = new Dept();
        dept.setName(param.getName());
        dept.setUpdateTime(LocalDateTime.now());
        dept.setCreateTime(LocalDateTime.now());
        int flag = deptService.insertDept(dept);

        return flag == 0 ? Result.error("插入失败") : Result.success();
    }

    /**
     * @RequestParam 注解使用：
     * 1. 根据指定的k 获取Http URL中的值
     * 2. 可以指定是否传参数，如果指定必传，前端没穿相应参数 报400 required
     * 3. 给参数指定默认值 defaultValue 默认属性
     * get也能传递请求体，但不符合RESTFUL风格
     */
    @Log
    @DeleteMapping
    public Result deleteById(@RequestParam(required = true) Integer id) {
        int i = deptService.deleteById(id);
        return i == 0 ? Result.error("删除失败") : Result.success();
    }

    /**
     * @param id
     * @return
     * @PathVariable 作用
     * 获取URI以/分割获取参数
     */
    @GetMapping("/{id}")
    public Result selectById(@PathVariable("id") Integer id) {
        SelectDeptDTO dept = deptService.selectById(id);
        return Result.success(dept);
    }
    @Log
    @PutMapping
    public Result updateDept(@RequestBody SelectDeptDTO dept) {
        log.info("名字{}",dept.getName());
        int i = deptService.updateDept(dept);
        return i == 0 ? Result.error("更新失败") : Result.success();
    }
    /*@DeleteMapping("/batch")
    public ResultUtil deleteBatchByIds(@RequestParam("ids") List<Integer> ids){
        log.info("批量删除{}",ids);
        //TODO 批量删除
        return ResultUtil.success();
    }*/
    /*@PostMapping("/batch")
    public ResultUtil insertBatch(@RequestBody List<InsertDeptParam> params){
        log.info("批量插入{}",params);
        //TODO 批量插入
        return ResultUtil.success();
    }*/

    /**
     * 请求路径/batch?ids=6&ids=7
     * @param request
     * @return
     */
    @Log
    @DeleteMapping("/batch")
    public Result deleteBatchByIds(HttpServletRequest request){
        String[] ids = request.getParameterValues("ids");
        log.info("批量删除{}", Arrays.asList(ids));
        //TODO 批量插入
        return Result.success();
    }

}
